package main

import (
	"fmt"
)

func throwPanic(f func()) (b bool) {
	defer func() {
		//recover()函数可以将程序从panic中恢复，只能在defer中使用，并且能获取panic的输入值，如果不在defer中使用，返回值为nil
		if x := recover(); x != nil {
			fmt.Println("panic已恢复，输入值：", x)
			b = true
		}
	}()
	f() //执行函数f，如果f中出现了panic，那么就可以恢复回来
	return
}

func f() {
	var arr = []int{1, 2, 3}
	fmt.Println(arr[3]) //数组切片越界，产生panic
	fmt.Println("这句话不会执行...")
}

func f2() {
	panic("产生panic...") //手动产生panic
}

func main() {
	b := throwPanic(f)
	fmt.Println("已从panic恢复：", b)

	//defer func() {
	//	fmt.Println(recover())
	//}()
	f2() //产生panic后，如果不recover程序会在此处停止，并在控制台打印信息
	fmt.Println("这句代码不会执行")
}
